package com.starry.module.system.core.dept.mapper;

import com.starry.core.common.domain.vo.PageVo;
import com.starry.db.core.mapper.BaseMapperX;
import com.starry.db.core.query.LambdaQueryWrapperX;
import com.starry.module.system.api.dept.domain.qo.SysDeptPageQo;
import com.starry.module.system.api.dept.domain.vo.SysDeptVo;
import com.starry.module.system.core.dept.entity.SysDept;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 系统机构-数据库服务层
 *
 * @author xiaoke
 */
@Mapper
public interface SysDeptMapper extends BaseMapperX<SysDept> {

    /**
     * 分页查询
     *
     * @param pageQo 分页参数
     * @return PageVo<SysDept>
     */
    default PageVo<SysDept> selectPage(SysDeptPageQo pageQo) {
        return selectPage(pageQo, new LambdaQueryWrapperX<SysDept>()
                .inIfPresent(SysDept::getPid, pageQo.getPidList())
                .likeIfPresent(SysDept::getName, pageQo.getName())
                .eqIfPresent(SysDept::getStatus, pageQo.getStatus())
                .orderByDesc(SysDept::getCreateTime)
        );
    }

    /**
     * 树形结构
     *
     * @param pageQo 分页参数
     * @return List<SysDept>
     */
    default List<SysDept> selectTree(SysDeptPageQo pageQo) {
        return selectList(new LambdaQueryWrapperX<SysDept>()
                .inIfPresent(SysDept::getPid, pageQo.getPidList())
                .likeIfPresent(SysDept::getName, pageQo.getName())
                .eqIfPresent(SysDept::getStatus, pageQo.getStatus())
                .orderByAsc(SysDept::getDeptRank)
        );
    }

    /**
     * 根据用户ID查询机构列表
     *
     * @param userId 用户ID
     * @return List<SysDeptVo>
     */
    List<SysDeptVo> selectByUserIDeptList(Long userId);
}

